﻿// Inner Fire 游戏引擎库
// UI - UI管理器
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 用于UI的管理器
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-25

#pragma once

#include <EASTL/vector.h>
#include <memory>
#include <sprite_pack.h>
#include <static_string.h>
#include <ui/component/button.h>
#include <ui/component/label.h>
#include <ui/component/ui_image.h>
#include <ui/text/bmfont.h>
#include <ui/ui_base.h>

namespace ifire::game {
class GameManager;

}

namespace ifire::ui {

class UIManager {
public:
  UIManager(ifire::game::GameManager* gm, const std::string_view& filename);
  UIManager(const UIManager& lhs) = delete;
  UIManager& operator=(const UIManager& lhs) = delete;
  ~UIManager() = default;

  SpritePack* GetSpritePack(ikit::sstr name);
  SpriteElement* GetSpriteElement(ikit::sstr pack_element);

  XMFLOAT2 GetAdjustPosition(const dx::UIWidget& widget) const;

  Label* FindLabel(ikit::sstr name);
  Button* FindButton(ikit::sstr name);

  // 通过一个Prefab创建一个Label
  Label* CreateLabel(
      ikit::sstr name_id, ikit::sstr prefab_name, XMFLOAT2 position);
  // 通过一个Prefab创建一个Button
  Button* CreateButton(ikit::sstr name_id, ikit::sstr prefab_name,
      ikit::sstr button_icon, const char* button_text, XMFLOAT2 position);
  // 通过一个Prefab创建一个Image
  Image* CreateImage(ikit::sstr name_id, ikit::sstr prefab_name,
      ikit::sstr image_icon, XMFLOAT2 position);

  void CreateImage(Image* img, dx::UIRenderItem* parent = nullptr);
  dx::DxLayout* CreateLayout(
      const dx::UIWidget& widget, dx::UIRenderItem* parent = nullptr);

  // 通过一个LabelInfo获得创建一个DxText需要的参数
  dx::DxTextDesc CreateTextDesc(const ui::LabelInfo& info) const;
  dx::DxImageDesc CreateImageDesc(
      SpriteElement* sprite, const dx::UIWidget& widget) const;
  dx::DxLayoutDesc CreateLayoutDesc(const dx::UIWidget& widget) const;

  // 处理鼠标移动信息
  void OnMouseMove(XMFLOAT2 delta, XMFLOAT2 pos);
  bool OnMouseDown(XMFLOAT2 pos);
  bool OnMouseUp(XMFLOAT2 pos);

  //
  // 属性访问
  //
  XMFLOAT2 GetClientSize() const;
  inline eastl::vector<SpritePackPtr>& Sprites() { return sprites_; }
  inline eastl::vector<ButtonPtr>& Buttons() { return buttons_; }
  inline eastl::vector<LabelPtr>& Labels() { return labels_; }
  inline eastl::vector<ImagePtr>& Images() { return images_; }
  inline BMFont* DefaultFont() const { return default_font_; }
  inline float DefaultFontSize() const { return default_font_size_; }
  inline float DefaultTextPadding() const { return default_text_padding_; }

private:
  ifire::game::GameManager* gm_;
  eastl::vector<SpritePackPtr> sprites_;
  eastl::vector<BMFontPtr> bmfonts_;
  eastl::vector<ButtonInfoPtr> button_infos_;
  /*eastl::vector<LabelInfoPtr> label_infos_;*/
  BMFont* default_font_;
  float default_text_padding_; // 文字的Padding。用于默认值。
  float default_font_size_; // 文字的大小（高度）。用于默认值。

  eastl::vector<ButtonPtr> buttons_;
  eastl::vector<LabelPtr> labels_;
  eastl::vector<ImagePtr> images_;
};

} // namespace ifire::ui